package com.aaa.service.sds.impl;

import com.aaa.dao.sds.TSdsDao;
import com.aaa.entity.MyPage;
import com.aaa.entity.sds.TSds;
import com.aaa.service.sds.TSdsService;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @version 1.8.0_181
 * @Author ZEH
 * @Date 2022/10/25 20:22
 * @注释
 */
@Service
public class TSdsServiceImpl implements TSdsService {

    @Autowired
    private TSdsDao tSdsDao;


    /**
     * 模糊查询
     * @param myPage
     * @param tSds
     * @return
     */
    @Override
    public PageInfo queryAllSds(MyPage myPage, TSds tSds) {
        PageHelper.startPage(myPage.getPage(), myPage.getLimit());
        PageInfo pageInfo = new PageInfo(tSdsDao.queryAllSds());

        return pageInfo;
    }

    /**
     * 添加/修改
     * @param tSds
     * @return
     */
    @Override
    public boolean insertSds(TSds tSds) {
        List<TSds> tSds1 = tSdsDao.queryBySdsno(tSds.getSdsno());
        System.out.println("查询是否有记录tSds1 = " + tSds1);
        int i;
        if (tSds1.size()!=0){
            //已存在
            return true;
        }else {
            if (tSds.getId() == null){
                //题号为空  可加入
                i = tSdsDao.insertSds(tSds);
                System.out.println("添加i = " + i);
                return false;
            }else {
                //修改
                    List<TSds> tSds2 = tSdsDao.queryBySdsno(tSds.getSdsno());
                    if (tSds2.size()!=0){
                        return true;//被做过
                    } else {
                        i=tSdsDao.updateByPrimaryKey(tSds);
                        System.out.println("修改i = " + i);
                        return false;
                    }
            }

        }
    }

    /**
     * 单条删除
     * @param id
     * @param sdsno
     * @return
     */
    @Override
    public boolean deleteSds(Integer id,Integer sdsno) {
        List<Map<String, Object>> panduaniszuo = tSdsDao.panduaniszuo(sdsno);
        if (panduaniszuo.size()!=0){
            return false;//有
        }else {
            boolean delete = tSdsDao.deleteSds(id);
            System.out.println("单条删除delete = " + delete);
            return true;
        }


    }

    @Override
    public boolean updateSds(TSds tSds) {
        boolean update = tSdsDao.updateSds(tSds);
        return update;
    }

    @Override
    public boolean querySdsname(TSds tSds) {
        boolean b = tSdsDao.querySdsname(tSds);
        return b;
    }

    @Override
    public void dealFile(MultipartFile file) {

        // 如果试题已经存在就不让再导入了
        int i = tSdsDao.selectCount(null);
        if(i>0){
            return;
        }
        else {

            InputStream is = null;
            try {
                is = file.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //1.进行读取数据，TFpaSub是我的pojo类，
            //2.new FileListener(fileService)这个是监听器，主要用来读取数据的
            //3.特别注意的是fileService这个service，我上面有注入进去 @Autowired/@Resource，切记不要new会报错
            //EasyExcel.read(is, TFpaSub.class, new FileListener(fileService)).sheet("FPA性格测试").doRead();
            EasyExcel.read(is, TSds.class, new AnalysisEventListener<TSds>() {
                /**
                 * 单次缓存的数据量
                 */
                public static final int BATCH_COUNT = 100;
                /**
                 * 临时存储
                 */
                private List<TSds> cachedDataList = new ArrayList<>();

                @Override
                public void invoke(TSds data, AnalysisContext context) {
                    cachedDataList.add(data);
                    if (cachedDataList.size() >= BATCH_COUNT) {
                        saveData();
                        // 存储完成清理 list
                        cachedDataList = new ArrayList<>();
                    }
                }

                @Override
                public void doAfterAllAnalysed(AnalysisContext context) {
                    saveData();
                }

                /**
                 * 加上存储数据库
                 */
                private void saveData() {
//            log.info("{}条数据，开始存储数据库！", cachedDataList.size());
//            log.info("存储数据库成功！");
                    save(cachedDataList);
                }
            }).sheet("抑郁自评量表").doRead();
        }
    }

    @Override
    public void save(List<TSds> list) {
        tSdsDao.insertFtaSubjects(list);
    }

    @Override
    public PageInfo getAll(MyPage myPage) {

        PageHelper.startPage(myPage.getPage(),myPage.getLimit());

        return new PageInfo(tSdsDao.selectAll());
    }

    /**
     * 模糊查询
     * @param myPage
     * @param tSds
     * @return
     */
    @Override
    public PageInfo querysdsAll(MyPage myPage, TSds tSds) {
        PageHelper.startPage(myPage.getPage(), myPage.getLimit());
        List<TSds> tSds1 = tSdsDao.queyrsdsAll(tSds);
        return new PageInfo<>(tSds1);
    }

    /**
     * 批量删除
     * @param id
     * @return
     */
    @Override
    public boolean delsdsbath(Integer[] id,Integer[] sdsno) {
        //int delsdsbath = tSdsDao.delsdsbath(id,sdsno);
        List<Map<String, Object>> panduaniszuo = tSdsDao.panduaniszuoBase(sdsno);
        if (panduaniszuo.size()!=0){
            return false;
        }else {
            int delsdsbath = tSdsDao.delsdsbath(id);
            return true;
        }

    }

    /**
     * 题号sdsno
     * @param sdsno
     * @return
     */
    @Override
    public boolean queryBySdsno(Integer sdsno) {
        List<TSds> tSds = tSdsDao.queryBySdsno(sdsno);
        System.out.println("tSds = " + tSds);
        if (tSds.size()!=0){
            return true;
        }
        return false;
    }


}
